library(tidyverse)
library(readr)
library(readxl)
library(janitor)
library(stringr)
library(scales)
library(lmtest)
library(sandwich)
library(broom)
library(tibble)
library(jsonlite)
library(forcats)
library(ggplot2)
library(ggrepel)
library(gganimate)
library(EEAaq)
La fertilidad humana es sensible a condiciones ambientales que afectan tanto a la salud reproductiva como a las decisiones familiares.
En particular, la calidad del aire se ha relacionado con alteraciones hormonales, inflamación sistémica y estrés oxidativo que pueden reducir la fecundidad, aumentar el riesgo de pérdida gestacional y acortar la ventana fértil. Más allá de los mecanismos biológicos, el entorno en que las familias planifican también responde a expectativas de salud pública, seguridad ambiental y confianza institucional.
En este contexto, la vigilancia de la calidad del aire (monitorización sistemática, cobertura de estaciones, reporte y disponibilidad de datos) puede operar como un bien público que mejora la salud y reduce la incertidumbre sobre riesgos ambientales. Una red de vigilancia más densa y activa suele acompañar estrategias de control, cumplimiento normativo y comunicación del riesgo, y puede facilitar políticas de reducción de emisiones.
El resultado esperado —si estos canales funcionan— es un entorno más saludable y predecible para la crianza, lo que, en teoría, podría favorecer niveles más altos de fertilidad.
Sin embargo, a nivel agregado (país), se conoce menos acerca de:
Hasta qué punto la intensidad de la vigilancia del aire se asocia con niveles de fertilidad.
Si la contaminación atmosférica efectiva (por ejemplo, el NO₂ medio) se relaciona con la fertilidad media de los países europeos.
Si estas relaciones se mantienen una vez que se consideran posibles fuentes de heterogeneidad, como diferencias de tamaño poblacional, urbanización o intensidad de monitorización.
El presente seminario aborda estas cuestiones desde una perspectiva descriptiva, utilizando datos agregados por país para Europa.
Analizar la relación entre la vigilancia y la calidad del aire y la fertilidad media (TFR) en los países europeos.
Vigilancia vs fertilidad
¿Existe asociación entre la intensidad de la vigilancia de la calidad
del aire y la fertilidad media (TFR) de los países europeos?
NO₂ vs fertilidad
¿Están los niveles medios de NO₂ en los países europeos relacionados con
sus niveles medios de fertilidad (TFR)?
CO₂ vs fertilidad ¿Existe relación directamente proporcional entre los niveles de dióxido de carbono y la fertilidad?
PM₂.₅ en la vigilancia vs fertilidad Analizar si la proporción de observaciones dedicadas a PM₂.₅ en los sistemas de vigilancia de la calidad del aire de los países europeos se asocia con su fertilidad media (TFR).
Pregunta: ¿Está asociada una mayor vigilancia de la calidad del aire con una mayor fertilidad en la población europea?
Hipótesis: Más vigilancia del aire implica más
fertilidad.
Vemos la “vigilancia” mediante el conteo de observaciones de calidad del
aire reportadas por país y año; y medimos la fertilidad con la
TFR (Eurostat).
Si la hipótesis es consistente con los datos, esperamos observar una relación positiva entre el nivel de vigilancia (más observaciones) y la TFR.
Nota: Esta hipótesis no asume causalidad por sí misma; es un test descriptivo de la asociación.
Trabajamos con dos fuentes principales:
Calidad del aire
(DataExtract.csv):
A partir de los registros originales, limpiamos nombres, homogeneizamos
países y contamos observaciones por país–año
(n_obs_aire).
Con ello construimos resúmenes por país (por ejemplo,
total_obs_aire y años_con_cobertura).
Fertilidad (Eurostat, anual)
(Fertilidad.csv):
Extraemos la TFR por país–año, homogeneizamos códigos
geo a nombres de país y calculamos resúmenes (por ejemplo,
tfr_mean por país).
# Lectura
aire <- read_delim(
"INPUT/DATA/DataExtract.csv",
delim = ",", escape_double = FALSE, trim_ws = TRUE
)
fertilidad <- read_delim(
"INPUT/DATA/Fertilidad.csv",
delim = ",", escape_double = FALSE, trim_ws = TRUE
)
# Limpieza básica
aire <- clean_names(aire)
fertilidad <- clean_names(fertilidad)
# FERTILIDAD (Eurostat): anual, con códigosque se pasan a los nombres de los paises
# Mantener 'geo' como código y luego mapeamos a 'country'
fert_codes <- fertilidad |>
filter(freq == "A") |>
transmute(
geo = geo, # código Eurostat
year = as.integer(time_period),
tfr = as.numeric(obs_value)
)
# Mapeo de códigos Eurostat a nombre país
fert_paises <- fert_codes |>
mutate(country = case_when(
geo == "AD" ~ "Andorra",
geo == "AL" ~ "Albania",
geo == "AM" ~ "Armenia",
geo == "AT" ~ "Austria",
geo == "AZ" ~ "Azerbaijan",
geo == "BA" ~ "Bosnia and Herzegovina",
geo == "BE" ~ "Belgium",
geo == "BG" ~ "Bulgaria",
geo == "BY" ~ "Belarus",
geo == "CH" ~ "Switzerland",
geo == "CY" ~ "Cyprus",
geo == "CZ" ~ "Czechia",
geo == "DE" ~ "Germany",
geo == "DK" ~ "Denmark",
geo == "EE" ~ "Estonia",
geo == "EL" ~ "Greece",
geo == "ES" ~ "Spain",
geo == "FI" ~ "Finland",
geo == "FR" ~ "France",
geo == "GE" ~ "Georgia",
geo == "GI" ~ "Gibraltar",
geo == "HR" ~ "Croatia",
geo == "HU" ~ "Hungary",
geo == "IE" ~ "Ireland",
geo == "IS" ~ "Iceland",
geo == "IT" ~ "Italy",
geo == "LI" ~ "Liechtenstein",
geo == "LT" ~ "Lithuania",
geo == "LU" ~ "Luxembourg",
geo == "LV" ~ "Latvia",
geo == "MC" ~ "Monaco",
geo == "MD" ~ "Moldova",
geo == "ME" ~ "Montenegro",
geo == "MK" ~ "North Macedonia",
geo == "MT" ~ "Malta",
geo == "NL" ~ "Netherlands",
geo == "NO" ~ "Norway",
geo == "PL" ~ "Poland",
geo == "PT" ~ "Portugal",
geo == "RO" ~ "Romania",
geo == "RS" ~ "Serbia",
geo == "RU" ~ "Russia",
geo == "SE" ~ "Sweden",
geo == "SI" ~ "Slovenia",
geo == "SK" ~ "Slovakia",
geo == "SM" ~ "San Marino",
geo == "TR" ~ "Türkiye",
geo == "UA" ~ "Ukraine",
geo == "UK" ~ "United Kingdom",
geo == "VA" ~ "Vatican City",
geo == "XK" ~ "Kosovo",
# Agregados (no países), fuera del join
geo %in% c("EU27_2020","EU27","EU28","EA19","EFTA") ~ NA_character_
)) |>
filter(!is.na(country)) |>
select(country, year, tfr)
aire_conteo
(país, año, n_obs_aire).fert_resumen_nombres (estadísticos por país).panel_aire_year_con_fert: panel país–año con resumen de
fertilidad adjunto.resumen_aire_fert_pais: resumen combinado por país,
utilizado para el gráfico de dispersión.#AIRE: conteo por país-año
# Normalizamos nombres y tipos; además, homogeneizamos algunos alias típicos
aire_conteo <- aire |>
mutate(
country = str_trim(country),
year = as.integer(year),
# Homogeneización de alias frecuentes (solo se aplica si existen)
country = recode(country,
"Turkey" = "Türkiye",
"Czech Republic" = "Czechia",
"Russian Federation" = "Russia",
"Republic of Moldova" = "Moldova",
"UK" = "United Kingdom",
"Great Britain" = "United Kingdom"
)
) |>
count(country, year, name = "n_obs_aire") |>
arrange(country, year)
# Resumen de fertilidad por país (nombres ya homogeneizados)
fert_resumen_nombres <- fert_paises |>
group_by(country) |>
summarise(
n_years = n(),
year_min = min(year, na.rm = TRUE),
year_max = max(year, na.rm = TRUE),
tfr_mean = mean(tfr, na.rm = TRUE),
tfr_min = min(tfr, na.rm = TRUE),
tfr_max = max(tfr, na.rm = TRUE),
.groups = "drop"
) |>
arrange(country)
# JOINS
# Panel país–año con resumen de fertilidad adjunto (join por country)
panel_aire_year_con_fert <- aire_conteo |>
left_join(fert_resumen_nombres, by = "country")
# Resumen por país: agregamos aire y fertilidad
aire_resumen_pais <- aire_conteo |>
group_by(country) |>
summarise(
n_years_aire = n_distinct(year),
year_min_aire = min(year, na.rm = TRUE),
year_max_aire = max(year, na.rm = TRUE),
total_obs_aire = sum(n_obs_aire, na.rm = TRUE),
avg_obs_por_year = mean(n_obs_aire, na.rm = TRUE),
.groups = "drop"
)
resumen_aire_fert_pais <- aire_resumen_pais |>
full_join(fert_resumen_nombres, by = "country") |>
arrange(country)
# Promedios de fertilidad usando solo años que existen en 'aire_conteo' (SOLAPAMIENTO)
fert_resumen_overlap <- fert_paises |>
semi_join(aire_conteo |> distinct(country, year), by = c("country","year")) |>
group_by(country) |>
summarise(
n_years_ovlp = n(),
year_min_ovlp = min(year, na.rm = TRUE),
year_max_ovlp = max(year, na.rm = TRUE),
tfr_mean_ovlp = mean(tfr, na.rm = TRUE),
.groups = "drop"
)
resumen_aire_fert_overlap <- aire_resumen_pais |>
full_join(fert_resumen_overlap, by = "country") |>
arrange(country)
Como primer “test”, graficamos tfr_mean
(eje x) frente a total_obs_aire (eje y)
por país y ajustamos una recta OLS con su banda
de confianza.
Este gráfico nos permite explorar de forma descriptiva si existe una asociación positiva entre la intensidad de vigilancia del aire y la fertilidad promedio en cada país.
#Gráfico
resumen_aire_fert_pais%>%
filter(!is.na(tfr_mean), !is.na(total_obs_aire)) %>%
ggplot(aes(x = tfr_mean, y = total_obs_aire)) +
geom_point(alpha = 0.7) +
geom_smooth(method = "lm", se = TRUE) +
labs(
title = "Observaciones de aire vs TFR medio (por país)",
x = "TFR medio",
y = "Observaciones de aire (total)"
) +
theme_minimal()
El diagrama de dispersión entre total_obs_aire (y) y
tfr_mean (x) con una recta OLS sugiere que, a grandes
rasgos, la asociación es como mucho débil y sensible a
outliers. Visualmente, la pendiente no parece fuertemente
positiva y la banda de confianza cubre valores cercanos a cero en buena
parte del rango de tfr_mean.
El eje Y (conteos absolutos) probablemente está afectado por tamaño poblacional, densidad urbana y número de estaciones; no es una “intensidad de vigilancia” comparable per cápita.
Lectura honesta.
Con este primer gráfico no podemos afirmar que “más vigilancia implica
más fertilidad”. Si existe relación, no es grande y podría estar mediada
por terceros factores (riqueza, contaminación, urbanización, gasto
sanitario, políticas familiares, etc.).
A continuación vamos a realizar los lest estadísticos de Pearson y Spearman para demostrar esto de manera más objetiva:
df_test <- resumen_aire_fert_pais %>%
filter(!is.na(tfr_mean), !is.na(total_obs_aire)) %>%
mutate(
y_log = log1p(total_obs_aire) # estabiliza varianza ante colas largas
)
#Correlaciones
cor_pearson <- cor.test(df_test$tfr_mean, df_test$y_log, method = "pearson")
cor_spearman <- cor.test(df_test$tfr_mean, df_test$y_log, method = "spearman", exact = FALSE)
# Empaquetado de resultados clave
resumen <- tibble(
indicador = c("Correlación Pearson (r)", "p-valor Pearson",
"Correlación Spearman (rho)", "p-valor Spearman"),
valor = c(
round(unname(cor_pearson$estimate), 3),
signif(cor_pearson$p.value, 3),
round(unname(cor_spearman$estimate), 3),
signif(cor_spearman$p.value, 3)))
knitr::kable(resumen, caption = "Tests estadísticos")
| indicador | valor |
|---|---|
| Correlación Pearson (r) | 0.017 |
| p-valor Pearson | 0.920 |
| Correlación Spearman (rho) | 0.026 |
| p-valor Spearman | 0.877 |
Los resultados del test confirman la lectura visual del gráfico:
Correlación de Pearson (r = 0.017, p = 0.92) -> no existe relación lineal entre la fertilidad media y el nivel total de observaciones de calidad del aire.
Correlación de Spearman (ρ = 0.026, p = 0.877) -> tampoco se observa relación monótona, es decir, los países con más vigilancia no presentan mayor ni menor fertilidad.
Ambos p-valores son muy superiores al umbral convencional de 0.05, lo que implica que no hay evidencia estadísticamente significativa de asociación entre ambas variables.
En términos sencillos, la intensidad de vigilancia del aire no parece explicar las diferencias de fertilidad entre países europeos. Esto sugiere que la hipótesis naïf (“más vigilancia → más fertilidad”) no se sostiene empíricamente en el corte transversal.
En esta segunda parte ampliamos el análisis pasando de la “vigilancia del aire” a la calidad del aire en sí, centrándonos en un contaminante clave: el dióxido de nitrógeno (NO₂). Este compuesto es un marcador típico de tráfico rodado y combustión urbana, y se ha vinculado con diversos efectos adversos para la salud, incluidos riesgos durante el embarazo y potenciales impactos en la salud reproductiva.
Pregunta:
¿Existe una relación entre los niveles medios de NO₂ en cada país
europeo y su fertilidad media?
Hipótesis:
Esperamos observar una relación negativa: países con
mayor NO₂ medio deberían presentar, en promedio, niveles más bajos de
fertilidad.
Como antes, esta hipótesis es descriptiva, no causal; buscamos el signo de la asociación en los datos agregados.
Para esta sección combinamos dos fuentes principales:
OMS_Datos.xlsx)
NO2 (μg/m3)).fert_resumen_nombres)
# Leer directamente desde la hoja principal
oms <- read_excel("INPUT/DATA/OMS_Datos.xlsx", sheet = "AAP_2022_city_v9")
# solo Europa
oms_europa <- oms %>%
filter(`WHO Region` == "European Region")
# variable country con nombres armonizados
oms_europa_limpio <- oms_europa %>%
mutate(
country = str_trim(`WHO Country Name`),
country = recode(
country,
"Turkey" = "Türkiye",
"Russian Federation" = "Russia",
"Republic of Moldova" = "Moldova"
)
)
Tras armonizar y unir ambas tablas mediante un
left_join(), obtenemos un panel ciudad–año con valores de
NO₂ y fertilidad media por país.
A partir de ese panel construimos un resumen por país
con las siguientes variables:
no2_mean: media del NO₂ por país.no2_median: mediana de NO₂.n_cities: número de ciudades o localidades
monitorizadas.tfr_mean: fertilidad media (Eurostat).Este resumen nos permite trabajar con una unidad clara (el país) y explorar la relación entre contaminación y fertilidad.
# JOIN: tabla OMS ciudad-año + resumen de fertilidad por país
oms_europa_con_fert <- oms_europa_limpio %>%
left_join(fert_resumen_nombres, by = "country")
#mirar qué países de OMS no tienen fertilidad
faltan_fert_oms <- oms_europa_limpio %>%
distinct(country) %>%
anti_join(fert_resumen_nombres %>% distinct(country), by = "country")
pais_no2_fert <- oms_europa_con_fert %>%
group_by(country) %>%
summarise(
no2_mean = mean(`NO2 (μg/m3)`, na.rm = TRUE),
no2_median = median(`NO2 (μg/m3)`, na.rm = TRUE),
n_cities = n_distinct(`City or Locality`),
tfr_mean = first(tfr_mean), # viene del resumen de fertilidad
.groups = "drop"
) %>%
filter(!is.na(no2_mean), !is.na(tfr_mean))
Para visualizar la relación NO₂–fertilidad utilizamos un gráfico de burbujas:
n_cities).Este enfoque es informativo porque combina: - diferencias en
contaminación,
- diferencias en fertilidad,
- y diferencias en la intensidad de monitorización entre países.
library(ggplot2)
library(ggrepel)
ggplot(pais_no2_fert,
aes(x = no2_mean,
y = tfr_mean,
size = n_cities)) +
geom_point(alpha = 0.7) +
geom_smooth(method = "lm", se = TRUE, linetype = "dashed") +
geom_text_repel(aes(label = country),
size = 3,
max.overlaps = 30) +
scale_size_continuous(name = "Nº de ciudades\nmonitorizadas") +
labs(
title = "NO2 medio vs fertilidad media por país europeo",
subtitle = "Tamaño del punto = nº de ciudades con datos de NO₂",
x = "NO2 medio (µg/m^3, OMS)",
y = "TFR medio (Eurostat)"
) +
theme_minimal()
El gráfico revela una estructura altamente dispersa:
En otras palabras:
no se aprecia evidencia de que mayores niveles medios de NO₂ estén
sistemáticamente asociados con menores niveles de fertilidad en
Europa.
Esto es coherente con la lectura de la Parte 1:
el vínculo entre contaminación atmosférica y natalidad, si existe,
parece débil a nivel agregado y probablemente mediado por múltiples
factores (urbanización, edad materna, políticas familiares, estructura
económica, densidad poblacional, etc.).
Aunque los efectos biológicos del NO₂ sobre la reproducción han sido documentados en estudios clínicos y epidemiológicos, estos pueden quedar enmascarados por la heterogeneidad interna de cada país y por la diferencia entre contaminación urbana y fertilidad nacional promedio.
En este tercer objetivo analizamos el papel de un contaminante global: el dióxido de carbono (CO₂).
A diferencia del NO₂, que refleja principalmente la contaminación urbana y la exposición directa de la población, el CO₂ es un gas de efecto invernadero cuya variación entre países está más ligada a su tamaño económico, estructura energética y nivel de industrialización.
Partimos de un fichero en formato JSON (CO2.json) que contiene las emisiones anuales de CO₂ (en kilotoneladas) por país y por año. A partir de este conjunto:
Se limpia y normaliza la información para construir una tabla CO2_limpio con las columnas:
country (nombre del país armonizado),
year (año),
co2_kt (emisiones totales de CO₂ en kilotoneladas).
Posteriormente se agregan los datos por país para obtener el resumen CO2_resumen_pais, que incluye:
co2_kt_mean: emisiones medias anuales de CO₂,
co2_kt_total: emisiones acumuladas,
junto con el número de años disponibles.
Finalmente, se realiza un full_join con
fert_resumen_nombres , de modo que
CO2_fert_resumen_pais contiene, para cada país, emisiones
medias de CO₂ y TFR media en el mismo periodo de referencia.
Este dataset combinado es la base para los gráficos y análisis de este objetivo.
library(tidyverse)
library(janitor)
library(jsonlite)
library(stringr)
# 1. LEER EL JSON COMO DATA FRAME (sin tidyjson, sin spread_all, porque daba fallos)
dioxidocarbono_df <- jsonlite::fromJSON("INPUT/DATA/CO2.json",
simplifyDataFrame = TRUE, # lo aplana a data.frame directamente
) %>%
as_tibble() %>%
clean_names()
# 2. TABLA CO2_limpio (país-año)
CO2_limpio <- dioxidocarbono_df %>%
transmute(
country_raw = str_trim(country_name),
year = as.integer(year),
co2_kt = as.numeric(co2_emissions_kt)
) %>%
mutate(
country = recode(
country_raw,
"Turkey" = "Türkiye",
"Czech Republic" = "Czechia",
"Russian Federation" = "Russia",
"Republic of Moldova" = "Moldova",
"UK" = "United Kingdom",
"Great Britain" = "United Kingdom"
)
) %>%
group_by(country, year) %>%
summarise(
co2_kt = sum(co2_kt, na.rm = TRUE),
.groups = "drop"
)
# 3. PANEL CO2 + FERTILIDAD (país–año)
CO2_fert_panel <- CO2_limpio %>%
inner_join(fert_paises, by = c("country", "year"))
# 4. RESUMEN POR PAÍS
CO2_resumen_pais <- CO2_limpio %>%
group_by(country) %>%
summarise(
n_years_co2 = n_distinct(year),
year_min_co2 = min(year, na.rm = TRUE),
year_max_co2 = max(year, na.rm = TRUE),
co2_kt_mean = mean(co2_kt, na.rm = TRUE),
co2_kt_total = sum(co2_kt, na.rm = TRUE),
.groups = "drop"
)
CO2_fert_resumen_pais <- CO2_resumen_pais %>%
full_join(fert_resumen_nombres, by = "country") %>%
arrange(country)
El análisis se estructura en dos pasos complementarios:
Gráfico de ranking tipo “lollipop” (Gráfico 3.1)
Ordena a los países por sus emisiones medias de CO₂ (co2_kt_mean).
La longitud de la barra horizontal indica el nivel de emisiones.
El color y el tamaño del punto representan la TFR media: tonos más cálidos y puntos más grandes indican mayor fertilidad.
Este gráfico permite visualizar si los grandes emisores tienden a concentrarse en niveles de fertilidad sistemáticamente distintos del resto.
co2_lolli <- CO2_fert_resumen_pais %>%
filter(!is.na(co2_kt_mean),
!is.na(tfr_mean))
ggplot(co2_lolli,
aes(x = co2_kt_mean,
y = fct_reorder(country, co2_kt_mean))) +
# palito
geom_segment(aes(x = 0,
xend = co2_kt_mean,
y = fct_reorder(country, co2_kt_mean),
yend = fct_reorder(country, co2_kt_mean)),
linewidth = 0.6,
alpha = 0.6) +
# punto, coloreado por TFR
geom_point(aes(color = tfr_mean,
size = tfr_mean),
alpha = 0.9) +
scale_size_continuous(name = "TFR medio") +
scale_color_viridis_c(name = "TFR medio", option = "C") +
labs(
title = "Ranking de emisiones medias de CO2 y fertilidad en Europa",
subtitle = "Línea = emisiones medias de CO2 (kt) | Color/tamaño = TFR medio",
x = "CO2 medio (kt, total país)",
y = NULL
) +
theme_minimal(base_size = 11) +
theme(
panel.grid.major.y = element_blank(),
panel.grid.minor = element_blank(),
legend.position = "right",
plot.title = element_text(face = "bold")
)
Gráfico animado CO₂–TFR por año (Gráfico 3.2)
Cada fotograma muestra un diagrama de dispersión entre
co2_kt y `tfr para un año concreto.
Se ajusta una recta de regresión lineal por año, con su banda de confianza.
Se añaden, en la esquina de la animación, el número de países incluidos y los coeficientes estimados (pendiente y R²).
Esta animación permite ver si la relación CO₂–TFR cambia con el tiempo y si, en algún periodo concreto, aparece una tendencia clara (positiva o negativa).
co2_fert_anim <- CO2_fert_panel %>%
filter(!is.na(co2_kt),
!is.na(tfr))
reg_stats <- co2_fert_anim %>%
group_by(year) %>%
summarise(
n = n(),
beta = coef(lm(tfr ~ co2_kt))[2],
r2 = summary(lm(tfr ~ co2_kt))$r.squared,
.groups = "drop"
)
library(gganimate)
p_anim <- ggplot(co2_fert_anim,
aes(x = co2_kt,
y = tfr)) +
# puntos por país
geom_point(aes(color = country),
alpha = 0.7,
size = 2,
show.legend = FALSE) +
# nombres de algunos países (opcionales: quita si molesta)
ggrepel::geom_text_repel(
data = ~ dplyr::filter(.x, co2_kt == max(co2_kt) | tfr == max(tfr)),
aes(label = country),
size = 3,
max.overlaps = 30,
show.legend = FALSE
) +
# recta de regresión por año
geom_smooth(method = "lm",
se = TRUE,
linetype = "dashed",
color = "deeppink") +
# texto con stats por año (beta, R², n)
geom_text(
data = reg_stats,
aes(x = -Inf, y = Inf,
label = sprintf("Beta = %.3f R2 = %.2f n = %d", beta, r2, n)),
hjust = -0.05,
vjust = 1.2,
size = 3.2,
inherit.aes = FALSE
) +
scale_x_continuous(labels = scales::comma) +
labs(
title = "Relación entre emisiones de CO₂ y fertilidad en Europa",
subtitle = "Año: {frame_time}",
x = "CO2 total del país (kt)",
y = "Tasa global de fecundidad (TFR)"
) +
theme_minimal(base_size = 12) +
theme(
panel.grid.minor = element_blank(),
plot.title = element_text(face = "bold")
) +
transition_time(year) +
ease_aes("linear")
# Ver la animación en el viewer
anim <- animate(p_anim,
nframes = 150,
fps = 10,
renderer = gifski_renderer())
anim
El gráfico de “lollipop” muestra que:
Los países con mayores emisiones medias de CO₂ (por ejemplo, economías más grandes o con mix energético intensivo en combustibles fósiles) no presentan niveles de fertilidad claramente diferenciados del resto.
Entre los países de la parte alta del ranking observamos TFR medias en un rango relativamente estrecho (en torno a 1.3–1.7 hijos por mujer), similares a las del resto de Europa.
Algunos países con emisiones muy bajas (como Malta o Albania) tampoco destacan por una fertilidad especialmente alta; al contrario, se sitúan en la parte baja o media del rango de TFR.
En conjunto, el ranking sugiere que no existe un patrón monotónico evidente del tipo “a más CO₂, menos (o más) fertilidad”. La posición en el ranking de emisiones parece estar explicada sobre todo por factores estructurales (tamaño económico, industria, energía), mientras que la fertilidad se mueve en un margen relativamente estrecho sin alinearse claramente con esas diferencias.
La animación año a año refuerza esta impresión:
En cada fotograma, los puntos (países) se distribuyen de forma bastante difusa sobre el plano CO₂–TFR, sin que se forme una nube claramente ascendente o descendente.
Las rectas de regresión que se ajustan por año suelen tener pendientes pequeñas y, visualmente, la banda de confianza es amplia y abarca valores cercanos a una pendiente nula.
Los coeficientes de determinación (R²) que se muestran en la animación son bajos en la mayoría de años, lo que indica que las emisiones de CO₂ explican sólo una fracción muy limitada de la variación en fertilidad entre países.
Tampoco se aprecia un cambio cualitativo de la relación a lo largo del tiempo: no hay un periodo donde la asociación se vuelva claramente más fuerte o cambie de signo de forma clara.
En términos prácticos, la lectura estadística es que, en los datos agregados país–año, las emisiones totales de CO₂ no guardan una relación robusta con la TFR:
Países muy emisores pueden tener fertilidad baja, media o relativamente alta.
Países con bajas emisiones pueden situarse también en cualquier punto dentro del rango de TFR observado.
Estos resultados son coherentes con la naturaleza del indicador:
El CO₂ es un contaminante global, cuyo volumen anual refleja principalmente tamaño económico, estructura productiva e intensidad energética, más que la exposición individual de la población a contaminantes locales.
Los mecanismos biológicos que podrían afectar a la fertilidad suelen estar más vinculados a exposiciones locales (NO₂, PM₂.₅, ozono, etc.) que a las emisiones totales de CO₂ a escala nacional.
Además, la fertilidad está fuertemente condicionada por factores demográficos y socioeconómicos (edad a la maternidad, mercado laboral, políticas de conciliación, normas culturales), que pueden enmascarar cualquier efecto asociado a un indicador tan agregado como las emisiones de CO₂.
Por tanto, el tercer objetivo confirma la idea general de los anteriores: cuando miramos a nivel país, con indicadores agregados, la relación entre contaminación (o emisiones) y fertilidad en Europa parece ser, como mínimo, muy débil y fuertemente confundida por otras dimensiones estructurales.
En este último objetivo profundizamos en un contaminante concreto, el material particulado fino (PM₂.₅), que se ha asociado con efectos adversos sobre la salud reproductiva, el embarazo y la mortalidad perinatal. A diferencia de los objetivos anteriores centrados en la intensidad global de la vigilancia o en contaminantes específicos como el NO₂ o el CO₂, aquí nos interesa qué peso tiene el PM₂.₅ dentro del esfuerzo total de monitorización de la calidad del aire en cada país.
La lógica es la siguiente: incluso si dos países tienen un volumen similar de observaciones de calidad del aire, pueden diferir en el énfasis que ponen sobre determinados contaminantes. Un país que dedica una mayor proporción de su vigilancia al PM₂.₅ estaría, en principio, más orientado a monitorizar riesgos finos para la salud cardiovascular y respiratoria, con posibles implicaciones para la salud reproductiva y, de forma indirecta, para la planificación familiar.
Pregunta: ¿Existe una relación entre el peso relativo del PM₂.₅ en la vigilancia del aire y la fertilidad media (TFR) de los países europeos?
Hipótesis: Si el PM₂.₅ es un marcador relevante de riesgos ambientales percibidos o efectivos, cabría esperar que los países que dedican una fracción mayor de sus observaciones a este contaminante presenten entornos más saludables o más vigilados, lo que podría asociarse con una fertilidad algo más elevada. De forma descriptiva, planteamos la hipótesis de que una mayor proporción de observaciones de PM₂.₅ se asocia con una TFR media más alta, aunque sin asumir causalidad.
En este objetivo analizamos el lugar que ocupa el contaminante PM₂.₅ dentro de la monitorización de calidad del aire en Europa.
Partimos de un fichero con registros de calidad del aire
(aire) que contiene observaciones por país, año y tipo de
contaminante. A partir de este conjunto:
Se limpia y normaliza la información para construir una tabla
aire_limpio con las columnas:
country (nombre del país armonizado),year (año en formato numérico),air_pollutant (tipo de contaminante),value (concentración u observación
correspondiente),is_pm25 (indicador lógico).Durante el proceso:
Turkey → Türkiye,
Czech Republic → Czechia,
Russian Federation → Russia, etc.).year esté en formato numérico.is_pm25, que toma valor
1 cuando air_pollutant está en
{"PM2.5","PM25","PM2p5"} y 0 en caso
contrario.Posteriormente, se agregan los datos por país para obtener el resumen
pm25_share_country, que incluye:
n_obs_total: número total de observaciones de calidad
del aire,n_obs_pm25: número de observaciones clasificadas como
PM₂.₅,share_pm25: fracción de observaciones dedicadas a
PM₂.₅,n_years: número de años con datos disponibles.Además se construye un panel año–país pm25_year_panel
con la proporción share_pm25_year calculada por
country y year, que permite analizar la
evolución temporal.
Finalmente, se realiza un left_join() con
fert_resumen_nombres (resumen de fertilidad) para obtener
pm25_share_tfr, que contiene, para cada país,
share_pm25 y tfr_mean. Para análisis año–año
se une pm25_year_panel con fert_paises para
obtener pm25_fert_panel
# Metadatos de estaciones EEA (dataframe interno)
stations_eea <- EEAaq_get_dataframe("stations") %>%
clean_names() %>%
mutate(
country_raw = str_trim(country),
country = recode(
country_raw,
"Turkey" = "Türkiye",
"Czech Republic" = "Czechia",
"Russian Federation" = "Russia",
"Republic of Moldova" = "Moldova",
"UK" = "United Kingdom",
"Great Britain" = "United Kingdom",
.default = country_raw
)
)
# OJO: aquí renombramos la columna rara 'air_quality_station_eo_i_code'
stations_meta <- stations_eea %>%
rename(
air_quality_station_eoi_code = air_quality_station_eo_i_code
) %>%
select(
air_quality_station_eoi_code,
country,
air_quality_station_area,
air_quality_station_type
)
pm25_share_country <- aire %>%
# Armonizamos país y año igual que en 'aire_conteo'
mutate(
country = str_trim(country),
year = as.integer(year),
country = recode(
country,
"Turkey" = "Türkiye",
"Czech Republic" = "Czechia",
"Russian Federation" = "Russia",
"Republic of Moldova" = "Moldova",
"UK" = "United Kingdom",
"Great Britain" = "United Kingdom"
),
# Indicador lógico: ¿esta fila es PM2.5?
is_pm25 = air_pollutant %in% c("PM2.5", "PM25", "PM2p5")
) %>%
group_by(country) %>%
summarise(
n_obs_total = n(),
n_obs_pm25 = sum(is_pm25, na.rm = TRUE),
share_pm25 = n_obs_pm25 / n_obs_total,
n_years = n_distinct(year),
.groups = "drop"
) %>%
arrange(desc(share_pm25))
pm25_share_tfr <- pm25_share_country %>%
left_join(fert_resumen_nombres, by = "country") %>%
filter(!is.na(tfr_mean), !is.na(share_pm25))
Para examinar cómo se relacionan el peso relativo de PM₂.₅ y la fertilidad media, utilizamos un gráfico circular de barras radiales. Esta visualización permite comparar simultáneamente ambos indicadores de manera intuitiva. El planteamiento es el siguiente:
share_pm25, es decir, la proporción de todas las
observaciones de calidad del aire que pertenecen a PM₂.₅ en ese
país.tfr_mean (tasa global de fecundidad media).Ordenamos los países de forma descendente por
share_pm25.
Después, convertimos country en un factor con ese
orden.
Esto asegura que, al pasar a coordenadas polares, los países aparezcan
ordenados alrededor del círculo según su peso relativo
de PM₂.₅.
Creamos un gráfico con geom_col() en
coordenadas cartesianas.
Transformamos el gráfico mediante
coord_polar(), convirtiendo las barras en
segmentos radiales que parten del centro.
tfr_mean facilita
detectar patrones visuales:# Ordenamos países por share_pm25 y preparamos factor
pm25_circ <- pm25_share_tfr %>%
arrange(desc(share_pm25)) %>%
mutate(
country = factor(country, levels = country),
label_pm = scales::percent(share_pm25, accuracy = 1)
)
ggplot(pm25_circ,
aes(x = country,
y = share_pm25,
fill = tfr_mean)) +
# barras radiales
geom_col(color = "white", width = 0.9, alpha = 0.9) +
# pasamos a coordenadas polares
coord_polar(start = -pi/2) +
# etiquetas de país + % PM2.5 (opcional)
geom_text(
aes(label = label_pm),
position = position_stack(vjust = 1.02),
size = 2.5,
show.legend = FALSE
) +
scale_y_continuous(labels = scales::percent_format(accuracy = 10)) +
labs(
title = "Peso relativo de PM2.5 en la vigilancia del aire por país",
subtitle = "Longitud de la barra = proporción de observaciones de PM2.5
\nColor = TFR media",
x = NULL,
y = NULL,
fill = "TFR media"
) +
theme_minimal() +
theme(
axis.text.x = element_text(size = 7, angle = 0, vjust = 0.5),
axis.text.y = element_blank(),
axis.ticks = element_blank(),
panel.grid = element_blank(),
plot.title = element_text(face = "bold", hjust = 0.5),
plot.subtitle= element_text(hjust = 0.5),
legend.position = "right"
)
El gráfico circular revela que el peso relativo del PM₂.₅ en la vigilancia de la calidad del aire es, en términos generales, bajo y heterogéneo entre países. La mayoría sitúa entre un 5 % y un 10 % de sus observaciones en PM₂.₅, mientras que solo un grupo reducido (entre ellos algunos países del norte o del entorno caucásico) supera claramente ese umbral y alcanza valores en torno al 12–16 %. En el extremo inferior aparecen varios países con barras muy cortas, señal de que el PM₂.₅ representa únicamente una fracción marginal de su registro total.
Al observar la escala de color, que codifica la
tfr_mean, no emerge un gradiente coherente que acompañe la
longitud de las barras. Entre los países con mayor
share_pm25 no destacan ni valores particularmente altos ni
particularmente bajos de fertilidad: sus tasas se concentran en la
zona intermedia del rango europeo. De forma simétrica,
entre los países cuyo peso relativo del PM₂.₅ es más reducido
encontramos tanto TFR comparativamente altas como
TFR bajas.
En conjunto, la visualización no sugiere la existencia de un patrón monotónico claro del tipo “a mayor share de PM₂.₅, mayor (o menor) fertilidad”. La importancia que cada país otorga a la monitorización del PM₂.₅ parece estar determinada, más bien, por criterios técnicos, regulatorios o institucionales propios de sus sistemas de vigilancia, y no por diferencias sistemáticas en comportamiento demográfico.
Así, del mismo modo que en los análisis previos, la evidencia descriptiva apunta a que la relación entre el peso relativo del PM₂.₅ en la monitorización del aire y la fertilidad media es débil y queda probablemente absorbida por otros factores económicos, sociales y demográficos que este indicador agregado no capta.
No poner nada hasta haber terminado todos los objetivos específicos
Eurostat. (s. f.). Fertility statistics (TFR by country and year). Oficina de Estadística de la Unión Europea.
World Health Organization. (2022). Ambient Air Pollution Database (AAP 2022). WHO, Department of Environment, Climate Change and Health.
Carré, J., Gatimel, N., Moreau, J., Parinaud, J., & Léandri, R. (2017). Does air pollution play a role in infertility? A systematic review. Environmental Health, 16(1), 82.
Landrigan, P. J., Fuller, R., Acosta, N. J. R., et al. (2018). The Lancet Commission on pollution and health. The Lancet, 391(10119), 462–512.
WHO. (2021). WHO global air quality guidelines: Particulate matter (PM₂.₅ and PM₁₀), ozone, nitrogen dioxide, sulfur dioxide and carbon monoxide. World Health Organization.